package cbfg.http.extra

import com.google.gson.TypeAdapter
import com.google.gson.internal.LinkedTreeMap
import com.google.gson.stream.JsonReader
import com.google.gson.stream.JsonToken
import com.google.gson.stream.JsonWriter
import java.io.IOException
import java.util.*

/**
 * @author: Tom Hawk
 * 添加时间: 2020/9/15 13:15
 * 功能描述: 重写 map 的反序列化
 */
class MapTypeAdapter : TypeAdapter<Any?>() {
    @Throws(IOException::class)
    override fun write(out: JsonWriter, value: Any?) {
        //序列化无需实现
    }

    @Throws(IOException::class)
    override fun read(jsonReader: JsonReader): Any? {
        return when (jsonReader.peek()) {
            JsonToken.BEGIN_ARRAY -> {
                val list: MutableList<Any?> = ArrayList()
                jsonReader.beginArray()
                while (jsonReader.hasNext()) {
                    list.add(read(jsonReader))
                }
                jsonReader.endArray()
                list
            }
            JsonToken.BEGIN_OBJECT -> {
                val map: MutableMap<String, Any?> = LinkedTreeMap()
                jsonReader.beginObject()
                while (jsonReader.hasNext()) {
                    map[jsonReader.nextName()] = read(jsonReader)
                }
                jsonReader.endObject()
                map
            }
            JsonToken.STRING -> jsonReader.nextString()
            /**
             * 改写数字的处理逻辑，将数字值分为整型与浮点型。
             */
            JsonToken.NUMBER -> {
                val dbNum = jsonReader.nextDouble()
                // 数字超过long的最大值，返回浮点类型
                if (dbNum > Long.MAX_VALUE) {
                    return dbNum
                }
                // 判断数字是否为整数值
                val lngNum = dbNum.toLong()
                if (dbNum == lngNum.toDouble()) lngNum else dbNum
            }
            JsonToken.BOOLEAN -> jsonReader.nextBoolean()
            JsonToken.NULL -> {
                jsonReader.nextNull()
                null
            }
            else -> throw IllegalStateException()
        }
    }
}